﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Usuario
    {
        RzCorportativo.DataAccess.Usuario model;

        public Usuario()
        {
        }

        public static Usuario CreateInstace(long usuarioId)
        {
            RzCorportativo.DataAccess.SistemaCurricularEntities db = new SistemaCurricularEntities();
            var p = db.Usuario.Where(w => w.UsuarioId == usuarioId).FirstOrDefault();
            Usuario pItem = new Usuario();
            if (p != null)
                pItem = pItem.Create(p);
            return pItem;
        }

        public bool IsNew { get { return this.UsuarioId == 0; } }

        public bool Ativo { get; set; }

        public string Email { get; set; }

        public DateTime DataNascimento { get; set; }

        public string Nome { get; set; }

        public long UsuarioId { get; set; }

        public string Sexo { get; set; }

        public string Telefone { get; set; }

        public string Cpf { get; set; }

        public string CartaoSUS { get; set; }

        public int LoginId { get; set; }

        public int EnderecoId { get; set; }

        public Endereco Endereco { get; set; }

        public Login Login { get; set; }
        
        public List<ItemAreaConhecimento> ItensConhecimento { get; set; }

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                if (this.Endereco != null)
                {
                    if (!this.Endereco.Salvar())
                        throw new Exception("Falha ao salvar o endereço no cadastro de usuários, favor entrar em contato com a equipe de desenvolvimento!");
                    this.EnderecoId = this.Endereco.EnderecoId;
                }
                
                if (this.IsNew)
                {
                    this.model = this.Insert(entity);
                    if (this.Login != null && !this.Login.CadastroCompleto)
                        this.Login.CadastroCompleto = true;
                }
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                throw ex;
            }).OnSuccess(() =>
            {
                @result = true;
                this.UsuarioId = this.model.UsuarioId;
            });
            return @result;
        }

        public bool AdicionarHabilidade(ItemAreaConhecimento item)
        {
            Transaction.Begin((context) =>
            {
                var model = this.CreateModel(context, true);
                var itemconhecimento = item.CreateModel(context, true);
                itemconhecimento.Usuario.Add(model);
                return true;
            }).OnError(e =>
            {
                throw e;
            }).OnSuccess(() =>
            {
                if (this.ItensConhecimento != null)
                {
                    this.ItensConhecimento.Add(item);
                }
            });
            return true;
        }

        public bool RemoverHabilidade(ItemAreaConhecimento item)
        {
            Transaction.Begin((context) =>
            {
                var model = this.CreateModel(context, true);
                var itemconhecimento = item.CreateModel(context, true);
                itemconhecimento.Usuario.Remove(model);
                return true;
            }).OnError(e =>
            {
                throw e;
            }).OnSuccess(() =>
            {
                if (this.ItensConhecimento != null)
                {
                    this.ItensConhecimento.RemoveAll(i => i.ItemAreaConhecimentoId == item.ItemAreaConhecimentoId);
                }
            });
            return true;
        }

        private DataAccess.Usuario Insert(SistemaCurricularEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToUsuario(@item);
            return @item;
        }

        private DataAccess.Usuario Update(SistemaCurricularEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private DataAccess.Usuario CreateModel(SistemaCurricularEntities entity, bool loadModel = false)
        {
            DataAccess.Usuario usuario = new DataAccess.Usuario();
            if (!this.IsNew)
            {
                usuario = entity.Usuario.Where(w => w.UsuarioId == this.UsuarioId).FirstOrDefault();
                if (usuario == null)
                    throw new Exception("Código inválido");
                if (loadModel)
                    return usuario;
            }

            usuario.Ativo = this.Ativo;
            usuario.DataNasc = this.DataNascimento;
            usuario.Email = this.Email;
            usuario.Nome = this.Nome;
            usuario.Sexo = this.Sexo;
            usuario.Telefone = this.Telefone;
            usuario.Cpf = this.Cpf;
            usuario.LoginId = this.LoginId;
            usuario.EnderecoId = this.EnderecoId;
            return usuario;
        }

        internal Usuario Create(DataAccess.Usuario item)
        {
            if (item == null)
                return null;
            Usuario usuario = new Usuario();
            usuario.UsuarioId = item.UsuarioId;
            usuario.Ativo = item.Ativo;
            usuario.DataNascimento = item.DataNasc;
            usuario.Email = item.Email;
            usuario.Nome = item.Nome;
            usuario.Sexo = item.Sexo;
            usuario.Telefone = item.Telefone;
            usuario.Cpf = item.Cpf;
            usuario.LoginId = item.LoginId;
            if (item.Login != null)
            {
                usuario.Login = new Login();
                usuario.Login.LoginId = item.LoginId;
                usuario.Login.LoginText = item.Login.Nick;
            }
            //usuario.CidadeId = item.CidadeId;
            //usuario.Endereco = item.Endereco;
            usuario.Endereco = new Lib.Endereco().CreateEndereco(item.Endereco);
            usuario.ItensConhecimento = item.ItemAreaConhecimento.Select(f => new ItemAreaConhecimento().Create(f)).ToList();
            return usuario;
        }

        public static List<Usuario> Listar(Usuario usuario)
        {
            if (usuario == null)
                usuario = new Usuario();
            List<Usuario> usuarios = new List<Usuario>();
            var db = new SistemaCurricularEntities();
            usuarios = db.Usuario.Where(w =>
                    /*
                     * Retirado filtro pois o mesmo não traz médicos quando se lista pascientes e um médico pode ser um paciente
                     */
                    //db.Medico.All(wA => wA.PessoaId != w.PacienteID) &&
                    ((usuario.UsuarioId == 0) || (usuario.UsuarioId == w.UsuarioId)) &&
                    ((usuario.Nome == null || usuario.Nome == "") || (w.Nome.Contains(usuario.Nome))) &&
                    ((usuario.Cpf == null || usuario.Cpf == "") || (w.Cpf.Contains(usuario.Cpf)))
                ).ToList().Select(s => usuario.Create(s)).ToList();
            return usuarios;
        }
    }
}